console.log(111);           //1.程序执行，首先执行第一行同步代码   输出  111
const promise = new Promise((resolve, reject) => {
  reject();
  console.log(222);         //2.由于本身是同步的，他只是处理异步的，而promise虽然失败，但是并不会中断回调函数的继续执行，所以打印222
});
promise
  .then(() => {             //3.then方法里面的回调函数是异步的，需要等同步代码执行完
    console.log(333);                   //12.同步代码处理完成，再来处理异步代码，由于前面的promise实例为失败，所以此处的
                                            //then方法里面的回调函数不会执行，直接穿透
    return new Promise((resolve) => {
      reject();
    });
  })
  .catch(() => {          //4.catch方法里面的回调函数是异步的，需要等同步代码执行完
    console.log(444);                 //13.由于前面的promise实例为失败，所以会调用catch方法，输出444
  })
  .then(() => {           //5.then方法里面的回调函数是异步的，需要等同步代码执行完
    console.log(555);                //14.由于前面调用catch方法成功，所以会调用then方法，输出555
    return new Promise((reject, resolve) => {
      reject();                   //15.由于返回的rejected是第一参数，所以此处的promise实例是成功
      // resolve();
    });
  })
  .catch(() => {           //6.catch方法里面的回调函数是异步的，需要等同步代码执行完
    console.log(666);             //16.由于上面.then的状态成功，所以此处的catch里面的回调函数不会执行，直接穿透
    throw new Error("报错了~");
  })
  .then(() => {            //7.then方法里面的回调函数是异步的，需要等同步代码执行完
    console.log(777);             //17.由于上面.then的状态成功，所以执行.then方法，打印777
    throw new Error("报错了~");       //18.  .then的状态变成失败
  })
  .then(() => console.log(888))          //8.then方法里面的回调函数是异步的，需要等同步代码执行完
                                                //19.由于上面.then的状态是失败，所以此处的then里面的回调函数不会执行，直接穿透
  .then(() => console.log(999))            //9.then方法里面的回调函数是异步的，需要等同步代码执行完
                                                  //20.由于上面.then的状态是失败，所以此处的then里面的回调函数不会执行，直接穿透
  .catch(() => console.log(101010));       //10.catch方法里面的回调函数是异步的，需要等同步代码执行完
                                              //21.由于上面.then的状态是失败，所以执行catch方法，打印101010
console.log(111111);                    // 11.同步代码，输出   11111111


// 由 1-21  最终结果为 ：  111  222  111111  444  555 777 101010